package com.example.bitoperation;

/**
 * 编写一个函数，不用临时变量，直接交换numbers = [a, b]中a与b的值。
 * <p>
 * 示例：
 * 输入: numbers = [1,2]
 * 输出: [2,1]
 * <p>
 * 提示：
 * numbers.length == 2
 * -2147483647 <= numbers[i] <= 2147483647
 */
public class Interview16_01_SwapNumbers {
    public static void main(String[] args) {
        int[] nums = {5, 0};
//        System.out.println(3 ^ 4 ^ 4);
        int[] nums2 = new Solution().swapNumbers(nums);

        for (int i : nums2) {
            System.out.println(i);
        }


    }

    static class Solution {
        public int[] swapNumbers(int[] numbers) {
            // 方法一:异或 原理:一个数对另一个数位异或两次，该数不变
            numbers[0] = numbers[0] ^ numbers[1]; // 相当于对nums[1], nums[2]进行了"加密"用变量存储起来
            numbers[1] = numbers[0] ^ numbers[1]; // 解密得到 nums[0] 赋给nums[1]
            numbers[0] = numbers[0] ^ numbers[1]; // 因为此时nums[1] 已经是之前nums[0]的值,所以再一次异或就相当于对原来的nums[1]"解密",并赋给nums[0]

            // 方法二:加法 两个数相加之后，可能其结果超出了变量类型能表达的最大范围，这个时候结果就会出问题，不推荐使用
//            numbers[0] = numbers[0] + numbers[1];
//            numbers[1] = numbers[0] - numbers[1];
//            numbers[0] = numbers[0] - numbers[1];

            return numbers;
        }
    }
}
